// 对axios网络请求方法 进行二次封装    
import axios from 'axios'
import qs from 'querystring'
import { getActivePinia } from 'pinia';
import { useuserInfoStore } from '@/store/modules/login'; // 导入你的 Pinia Store

let isRefreshing = false;
let failedRequests = [];

const apiUrl = import.meta.env.VITE_API_URL;
const requests = axios.create({
    baseURL: apiUrl,
    timeout: 5000
})

// 刷新 Token 的函数
const refreshAccessToken = async () => {
    try {
        // ✅ 动态获取 Pinia Store 实例
        const pinia = getActivePinia();
        if (!pinia) throw new Error('Pinia 未初始化');
        const userInfoStore = useuserInfoStore(pinia); // 传入 pinia 实例

        const res = await axios.post('/api/refresh-token', {}, {
            withCredentials: true // 允许发送 Cookie（携带 Refresh Token）
        });
        // console.log(res);
        const newToken = res.data.accessToken;

        // 更新 Pinia Store 和 localStorage
        userInfoStore.changetoken(newToken); // 调用 Store 的 changetoken 方法

        return newToken;
    } catch (err) {
        // 清除所有存储的 Token
        const pinia = getActivePinia();
        if (pinia) {
            const userInfoStore = useuserInfoStore(pinia);
            userInfoStore.changetoken(''); // 清空 Store 中的 Token
        }
        localStorage.removeItem('userInfo');
        // window.location.href = '/login';
        throw err;
    }
  };
// 添加请求拦截器    带自动刷新的请求拦截器
requests.interceptors.request.use(function (config) {//config发送请求的配置参数信息
    //config可以判断请求的方式get/post 请求url参数地址 headers请求头配置 参数data发送的数据等信息
    // console.log('config-请求拦截器',config);
    //对post请求处理参数
    if (config.method == 'post') {
        config.data = qs.stringify(config.data)
    }
    if (config.url != '/login') {
        const { accessToken } = JSON.parse(localStorage.getItem('userInfo'))
        config.headers.Authorization = `Bearer ${accessToken}`;
    }
    // 在发送请求之前做些什么--对post请求参数 处理字符串拼接
    return config;
}, async function (error) {
    return Promise.reject(error);
});


// 添加响应拦截器 -- 对错误的数据处理参数
requests.interceptors.response.use(
    response => response.data,
    async error => {
        const originalRequest = error.config;

        // 调试关键点
        // console.log('HTTP Status:', error.response?.status);
        // console.log('Response Data:', error.response?.data);

        // 条件1：明确识别Token过期（状态码401且特定错误码）
        const isTokenExpired = (
            error.response?.status === 403 &&
            error.response?.data?.code === 'TOKEN_EXPIRED'
        );

        // 条件2：避免重复刷新
        if (isTokenExpired && !originalRequest._retry) {
            if (isRefreshing) {
                return new Promise(resolve => {
                    failedRequests.push(() => {
                        const { accessToken } = JSON.parse(localStorage.getItem('userInfo'))
                        originalRequest.headers.Authorization = `Bearer ${accessToken}`;
                        resolve(axios(originalRequest));
                    });
                });
            }

            originalRequest._retry = true;
            isRefreshing = true;

            try {
                const newToken = await refreshAccessToken();
                originalRequest.headers.Authorization = `Bearer ${newToken}`;
                const response = await axios(originalRequest);
                failedRequests.forEach(cb => cb());
                failedRequests = [];
                return response.data;
            } catch (refreshErr) {
                // 刷新失败时清理状态并跳转登录
                console.log('刷新失败时清理状态并跳转登录');
                localStorage.removeItem('userInfo');
                window.location.href = '/login';
                return Promise.reject(refreshErr);
            } finally {
                isRefreshing = false;
            }
        }

        // 其他错误直接拒绝
        return Promise.reject(error);
    }
);
//导出请求
export default requests
